/**
 * 作者：淡淡的月饼
 * 时间：2016.9.1
 * 依赖：jQuery
 * 调用示例：
 */
;(function(win){
    //构造函数
    var McakeForm = function(options){
        //默认配置项
        this.config = {
            wrapClass:"body",              //表单主容器 默认为body
            itemClass:".data-item",        //项目主容器 默认为data-item
            //基本类型
            itemType:{
                "text":true,               //输入框
                "division-text":true,      //分割文本 
                "time":true,               //时间选择
                "radio":true,              //单选框
                "checkbox":true,           //多选框
                "select":true,             //下拉选择框
                "combo-select":true        //comboSelect下拉选择框
            }
        }

        //初始化
        this.init(options);
    }

    //方法集
    McakeForm.prototype = {
        //构造函数名称
        constructor: McakeForm,
        //初始化函数
        init:function(options){
            //输入参数
            this.config = $.extend(this.config,options || {});
            //获取相关参数
            var self = this,
                _config = self.config;  //配置
                $wrap = $(_config.wrapClass),//数据表单主容器
                $formItem = $wrap.find(_config.itemClass),//所有数据项目
                $optionalItem = $wrap.find(_config.itemClass+"[data-optional='true']"),//所有可选项目
                $checkOpenItem = $wrap.find(_config.itemClass+"[data-open='true']");//所有控制选择框项目



            //储存相关项目到当前对象
            self.$wrap = $wrap;
            self.$formItem = $formItem;
            self.$optionalItem = $optionalItem;
            self.$checkOpenItem = $checkOpenItem;
            self.itemClass = _config.itemClass;

            //设置完成后初始化 初始化可选项项目
            self._initOptionalItem();
            //绑定可选项目点击事件 控制显示与隐藏
            self._bindOptionalItemClick();
            //初始化控制型可选框项目
            self._initCheckOpenItem();
            //绑定控制型可选项目点击事件
            self._bindCheckOpenItemChange();

            //初始化combo插件下的下拉选择框
            self.initComboSelect();

            return self;
        },
        //初始化该项目 主要控制显示与隐藏
        initItem:function(obj){
        },
        //初始化下拉选择框插件
        initComboSelect:function($select){
            var self = this,
                $wrap = self.$wrap;
            //如果没传入指定的选择框 则初始化全部
            if(!$select){
                $select = $wrap.find("select.data-combo-select");
            }
           
            //初始化插件
            if($select.length > 0)$select.comboSelect();

        },
        //初始化可选项的显示与隐藏 
        _initOptionalItem:function(targetObj){
            var self = this,
                _itemClass = self.itemClass,//项目主容器的class
                $optionalItem = self.$optionalItem;//可选项目
            // 如果传入了目标对象 则初始化目标对象下的所有可选项 否则初始化整个表单的可选项
            if(targetObj){
                $optionalItem = targetObj;
            }

            //循环设置可选项下的内容
            $optionalItem.each(function(i,item){
                var $optItem = $(item),
                    $optCheckbox = $optItem.find(">.data-item-tit input.optional-checkbox"),  //可选框
                    checkVal = $optCheckbox.attr("data-check"),//可选框的选中状态属性 
                    $optItemCont = $optItem.find(">.data-item-cont"),//当前层级内容
                    $subItem = $optItem.find(_itemClass+":not('[data-optional]')"), //底下所有普通项目
                    $subOptItem = $optItem.find(">"+_itemClass+"[data-optional='true']"),//底下所有可选项目"
                    $subOpenItem = $optItem.find(">"+_itemClass+"[data-open='true']");//所有子控制可选框项目

                //如果状态为选中 则设置显示 否则隐藏
                if(checkVal == "1"){
                    //设置勾选框状态为打开
                    $optCheckbox.prop("checked",true);
                    //设置内容显示
                    $optItemCont.show();
                    //显示所有普通项目
                    $subItem.show();
                    //显示所有的可选项
                    $subOptItem.show();
                }
                else{
                    self._clearItemData($optItem,true);
                }

                //假如下一级中还有可选项 那么继续执行一遍这个函数
                if($subOptItem){
                    self._initOptionalItem($subOptItem);
                }
                //假如下一级存在可选框控制型项目 进行初始化
                if($subOpenItem){
                    self._initCheckOpenItem($subOpenItem);
                }
    
            });

        },
        //初始化控制型选择框项目
        _initCheckOpenItem:function(targetObj){
            var self = this,
                _itemClass = self.itemClass,//项目主容器的class
                $checkOpenItem = self.$checkOpenItem;//控制型选择框项目
            // 如果传入了目标对象 则初始化目标对象下的所有可选项 
            // 否则初始化整个表单的控制型选择框项目
            if(targetObj){
                $checkOpenItem = targetObj;
            }

            //循环设置控制型可选框下的内容
            $checkOpenItem.each(function(i,item){
                var $openItem = $(item),
                    $openCheckIpt = $openItem.find(".data-item-cont:first .data-open"), //控制可选框
                    $subOpenItem = $openItem.find(">"+_itemClass+"[data-open='true']"),//所有子控制可选框项目
                    $subOptItem = $openItem.find(">"+_itemClass+"[data-optional='true']");//底下所有可选项目
                //循环处理所有控制按钮
                $openCheckIpt.each(function(j,ipt){
                    var $ipt = $(ipt),
                        checkState = $ipt.is(":checked"),//选中状态
                        openTarget = $ipt.attr("open-target");//控制目标
                    //如果目标属性存在 初始化目标
                    if(openTarget){
                        self._checkOpenItemView(checkState,openTarget);
                    }
                });

                //假如下一级中还有可选项 那么继续执行一遍这个函数
                if($subOpenItem){
                    self._initCheckOpenItem($subOpenItem);
                }

                //假如下一级中还有可选项 那么继续执行一遍这个函数
                if($subOptItem){
                    self._initOptionalItem($subOptItem);
                }
            
            });

        },
        //控制选择框类型目标的显示与隐藏
        //两个参数 checkState选中状态 openTarget控制目标
        _checkOpenItemView:function(checkState,openTarget){
            var self = this,
                $openTarget = $(openTarget);
            //如果选中
            if(checkState){
                $openTarget.show();
            }
            //如果没有选中 隐藏重置该项目
            else{
                $openTarget.hide();
                self._clearItemData($openTarget);
            }
        },
        //绑定控制型项目可选框值发生改变的事件
        _bindCheckOpenItemChange:function(){
            var self = this,
                _itemClass = self.itemClass,//项目主容器的class
                $openItem = self.$checkOpenItem,//控制型选择框项目
                $openCheckIpt = $openItem.find(".data-item-cont:first .data-check");//可选框

            //绑定事件
            $openCheckIpt.on("click",function(){
                //找到该可选框所在的项目 将他初始化
                var $thisItem = $(this).parents(_itemClass+":first");
                //调用初始化函数
                self._initCheckOpenItem($thisItem);
            });



        },
        //给所有可选项绑定点击事件
        _bindOptionalItemClick:function(){
            var self = this,
                _itemClass = self.itemClass,//项目主容器的class
                $optionalItem = self.$optionalItem,
                $optCheckbox = $optionalItem.find(">.data-item-tit input.optional-checkbox");

            //绑定点击事件
            $optCheckbox.off("click.optional");
            $optCheckbox.on("click.optional",function(e){
                var $this = $(this),
                    dataCheck = $this.attr("data-check"),//当前选中状态
                    $thisItem = $this.parents(_itemClass+":first");//当前项目
                //切换选中状态
                if(dataCheck == "1"){
                    $this.attr("data-check","0");
                    //重置当前可选项目
                    self.clearItem($thisItem);

                }else{
                    $this.attr("data-check","1");
                    self._initOptionalItem($thisItem);

                }
                //console.log($thisItem)

            });


        },
        //设置表单数据
        setValue:function(formData){
            var self = this,
                _config = self.config,//配置参数
                itemType = _config.itemType, //数据类型
                $formItem = self.$formItem;//获得所有表单项目
            //打印传入的表单数据
            //console.log(formData);
            //循环设置所有项目
            $formItem.each(function(i,item){
                var $item = $(item),
                    nowItemType = $item.attr("data-type"),//当前项目类型
                    nowItemName = $item.attr("data-value") || "",//当前项目名称用于单字段类型 统一将变量转换成小写
                    isOptional = $item.attr("data-optional"); //是否为可选项
                    
                //获得当前项目的值
                var nowItemValue = formData[nowItemName];
                //console.log(nowItemValue);
                //如果当前项目 是指定的基本类型 并状态为true
                if(itemType[nowItemType]){
                    /**
                     * 普通输入框类型 和 时间选择输入框数据
                     * 因为数据选择都是用输入框来实现 所以跟普通文本类型一样
                     * 他们都有两个共同的特点：
                     * 1，他们都有一个共同的class=data-text
                     * 2，他们的字段名(data-value)都是在输入框上面 因为会存在多个
                     */
                    if(nowItemType == "text" || nowItemType == "time"){
                        self._setValeuToText($item,formData);
                    }
                    /**
                     * 分割文本类型
                     * 比如电话010-8888888 由多个输入框拼接成一个字段
                     */
                    else if(nowItemType == "division-text"){
                        self._setValeuToDivisionText($item,nowItemValue);
                    }
                    /**
                     * 设置单选框和多选框数据
                     * 单选框和多选框都拥有共同的class="data-check"
                     */
                    else if(nowItemType == "radio" || nowItemType == "checkbox"){
                        self._setValeuToRadioAndCheckbox($item,nowItemValue);
                    }

                    /**
                     * 设置下拉选择框
                     * 结构类型跟普通输入框一般无二
                     */
                    else if(nowItemType == "select"){
                        self._setValeuToSelect($item,formData);
                    }
                    /**
                     * 设置comboSelect 下拉选择框
                     * 
                     */
                    else if(nowItemType == "combo-select"){

                        self._setValeuToComboSelect($item,formData);
                    }
                    else{
                        console.log("没有指定该类型");
                    }



                };

                //如果为可选项
                if(isOptional && isOptional == "true"){
                    //获得可选框 以及可选框的字段名
                    var $optCheckbox = $item.find(">.data-item-tit input.optional-checkbox"),
                        optCheckboxVal = $optCheckbox.attr("data-value");
                    // 如果字段存在 通过字段找到数据中的值
                    if(optCheckboxVal){
                        //如果该字段的值为空 则设置为0 也就是没被选中(1为选中)
                        var nowItemCheckVal = formData[optCheckboxVal] || "0";
                        self._setValueToOptionalCheck($optCheckbox,nowItemCheckVal);
                    }

                    //console.log($item);
                }


            });

            //设置完成后初始化 初始化可选项项目
            self._initOptionalItem();

            //初始化控制型可选框项目
            self._initCheckOpenItem();

            
        },
        //设置输入框类型数据
        _setValeuToText:function(itemObj,formData){
            //获得输入框
            var $ipt = itemObj.find(">.data-item-cont>.data-text");
            //console.log($ipt);
            //循环设置所有的输入框
            $ipt.each(function(i,item){
                var $item = $(item),
                    itemName = $item.attr("data-value") || "",//字段名
                    itemVal = formData[itemName];//字段内容
                //设置输入框内容
                $item.val(itemVal);
            });
        },
        //设置拼接型文本输入框数据
        _setValeuToDivisionText:function(itemObj,itemValue){
            //如果存在值
            if(itemValue){
                var itemValArr = itemValue.split("-");
                //获得所有分割文本输入框
                var $ipt = itemObj.find(">.data-item-cont>.data-division-text");
                //循环设置所有的输入框
                $ipt.each(function(i,item){
                    //设置输入框内容
                    $(item).val(itemValArr[i] || "");
                });
            }

        },
        //设置单选框和多选框数据
        _setValeuToRadioAndCheckbox:function(itemObj,itemValue){
            //如果存在值
            if(itemValue){
                //获得要设置的数据 这里用,分割是为了适用于多选框
                var itemValArr = itemValue.split(",");
                //console.log(itemValArr);
                //获得该项目下面的所有选框 
                //因为用>选择器会出现选中该项目下所有的子项目的BUG 
                //所以采用:first选择器
                var $checkIpt = itemObj.find(".data-item-cont:first .data-check");

                //循环所有的数据 设置给对应的输入框
                $.each(itemValArr,function(i,itemVal){
                    //获取选择框和输入框的值 -前面是选择框的值 后面是输入框的值
                    var dataCheckArr = itemVal.split("-");
                    //console.log(dataCheckArr);
                    //循环所有的选择框 并赋值
                    $checkIpt.each(function(j,ipt){
                        //获取所有输入框的data-check值
                        var $ipt = $(ipt),
                            iptdataCheck = $ipt.attr("data-check");
                        //找到该选择框的数据
                        if(dataCheckArr[0] == iptdataCheck){
                            //设置选中状态
                            $ipt.prop("checked",true)
                            //设置特殊拼接输入框的文本
                            if(dataCheckArr.length > 1){
                                //获得相邻的输入框
                                var $specialText = $ipt.parents("label").find(".data-check-txt");
                                //循环设置所有输入框的值
                                $specialText.each(function(l,speText){
                                    //他的值等于他所在位置+1 应该为前面有个选择框
                                    $(speText).val(dataCheckArr[l+1]);
                                });
                            }
                        }
                    });
                    
                });
            }
        },
        //设置下拉选择框
        _setValeuToSelect:function(itemObj,formData){
            //获得输入框
            var $select = itemObj.find(">.data-item-cont>.data-select");
            //循环设置所有的输入框
            $select.each(function(i,item){
                var $item = $(item),
                    itemName = $item.attr("data-value") || "",//字段名
                    itemVal = formData[itemName];//字段内容
                if(itemVal){
                    //将选项的值 分割成数组 用于支持多选
                    itemVal = itemVal.split(",");
                    //设置输入框内容
                    $item.val(itemVal);
                }
            });
        },
        //设置ComboSelect 下拉选择框
        _setValeuToComboSelect:function(itemObj,formData){
            //获得输入框
            var $select = itemObj.find(">.data-item-cont .data-combo-select");
            // console.log($select);
            //循环设置所有的输入框
            $select.each(function(i,item){
                var $item = $(item),
                    itemName = $item.attr("data-value") || "",//字段名
                    itemVal = formData[itemName];//字段内容
                //设置输入框内容
                $item.val(itemVal);
                //重新初始化下拉框
                $item.comboSelect();
            });
        },
        //设置可选项项目数据
        _setValueToOptionalCheck:function(checkObj,value){
            //设置打开状态值 1为选中 0为未被选中
            checkObj.attr("data-check",value);
            //如果设置勾选框的选中状态
            if(value == "1"){
                checkObj.prop("checked",true);
            }else{
                checkObj.prop("checked",false);
            }
        },
        //获取整个表单数据
        getValue:function(wrapObj){
            var self = this,
                _itemClass = self.itemClass,//项目主容器的class
                $formItem = self.$formItem;
            //获得所有的项目
            var $dataItem;
            //如果传入了容器 则获取指定容器下的所有项目 否则获取当前实例下所有项目
            if(wrapObj){
                //判断传入的是不是jquery对象
                $wrapObj = self.typeOfJquery(wrapObj);
                $dataItem = $wrapObj.find(_itemClass);
            }else{
                $dataItem = $formItem;
            }
            //结果数据
            var reslut = null;

            //获得所有项目的数据
            var allItemData = self.getItemValue($dataItem);
            if(allItemData){
                reslut = allItemData;
            }
            return reslut;
        },
        //获得单个或多个字段的数据 
        //注意 这里之后获得当前item的数据 而不会获得他的子项目数据
        getItemValue:function(itemObj){
            //当前实例
            var self = this;
            //返回结果数据
            var reslutJson = {};
            
            if(itemObj){
                //判断传入的是不是jquery对象
                var $itemObj = self.typeOfJquery(itemObj);

                //循环获得每一项数据
                $itemObj.each(function(i,item){
                    var $item = $(item),
                        itemType = $item.attr("data-type"),//数据类型
                        itemValue = $item.attr("data-value"),//项目字段名 适用于只有一个字段的项目
                        itemOptional = $item.attr("data-optional");//是否为可选项

                    //接收项目数据变量
                    var itemOptJson,//临时可选项数据
                        itemJson;//临时项目数据

                    //判断项目是否为可选项
                    if(itemOptional && itemOptional == "true"){
                        // optState = true;
                        itemOptJson = self._getValueToOptionalItem($item);
                    }
                    
                    //获取各种类型的数据
                     
                    /**
                     * 普通输入框类型 和 时间选择输入框数据
                     * 因为数据选择都是用输入框来实现 所以跟普通文本类型一样
                     * 他们都有两个共同的特点：
                     * 1，他们都有一个共同的class=data-text
                     * 2，他们的字段名(data-value)都是在输入框上面 因为会存在多个
                     */
                    if(itemType == "text" || itemType == "time"){
                        itemJson = self._getValeuToText($item);
                    }
                    /**
                     * 分割文本类型
                     * 比如电话010-8888888 由多个输入框拼接成一个字段
                     */
                    else if(itemType == "division-text"){
                        itemJson = self._getValeuToDivisionText($item,itemValue);
                    }
                    /**
                     * 获取选择类型的数据 包括单选框和多选框
                     */
                    else if(itemType == "radio" || itemType == "checkbox"){
                        itemJson = self._getValeuToRadioAndCheckbox($item,itemValue);
                    }
                    /**
                     * 获取下拉选择框的数据
                     * 跟普通输入框一样
                     */
                    else if(itemType == "select"){
                        itemJson = self._getValeuToSelect($item);
                    }
                    /**
                     * ComboSelect插件 下拉选择框
                     * 
                     */
                    else if(itemType == "combo-select"){
                        itemJson = self._getValeuToComboSelect($item);
                    }



                    //合并所有的数据到最终的数据中
                    $.extend(reslutJson,itemOptJson,itemJson);
                    
                });
            }else{
                console.log("错误：没有传入要获取的项目");
            }

            return reslutJson;
        },
        //获取普通文本输入框和时间选择输入框的数据 传入一个参数：即当前项目
        _getValeuToText:function(itemObj){
            //结果
            var reslut = {};
            //获得所有输入框
            var $iptList = itemObj.find(">.data-item-cont>.data-text");
            //循环获得所有的输入框的字段名和数据
            $iptList.each(function(i,ipt){
                var $ipt = $(ipt),
                    iptName = $ipt.attr("data-value") || "",//字段名
                    iptVal = $.trim($ipt.val());//字段内容 去除前后空格
                //设置每一条数据
                reslut[iptName] = iptVal;
            });
            return reslut;
        },
        //获取分割文本输入框的数据 文本分割符号为"-"
        //传入两个参数：1，当前项目   2，当前项目字段名
        _getValeuToDivisionText:function(itemObj,itemValue){
            //结果
            var reslut = {};
            //如果字段名存在 防止没有设置字段名而报错
            if(itemValue){
                //获得所有输入框
                var $iptList = itemObj.find(">.data-item-cont>.data-division-text");
                var iptValArr = [];
                //循环获得所有的输入框的字段名和数据
                $iptList.each(function(i,ipt){
                    var $ipt = $(ipt),
                        iptVal = $.trim($ipt.val());//字段内容
                    //设置每一个输入框的数据到结果数组中
                    iptValArr.push(iptVal);
                });
                reslut[itemValue] = iptValArr.join("-");
            }
            return reslut;
        },
        //获得单选框和多选框类型的数据
        //传入两个参数：1，当前项目   2，当前项目字段名
        _getValeuToRadioAndCheckbox:function(itemObj,itemValue){
            var self = this;
            //结果
            var reslut = {};
            //如果字段名存在 防止没有设置字段名而报错
            if(itemValue){
                //存放所有选中值的临时数组
                var checkValArr = [];
                //获得所有选择框
                var $checkIpt = itemObj.find(".data-item-cont:first .data-check");
                //循环所有的输入框 找到被选中的
                $checkIpt.each(function(i,ipt){
                    var $ipt = $(ipt),
                        thisChecked = $ipt.is(":checked");//检查当前选择框是否被选中
                    //如果被选中
                    if(thisChecked){
                        //获得当前选择框的值
                        var thisCheckVal = $ipt.attr("data-check");
                        //获得分割特殊文本框
                        var $specialText = $ipt.parents("label").find(".data-check-txt");
                        //如果存在特殊输入框
                        if($specialText.length > 0){
                            var specialArr = [];
                            $specialText.each(function(i,specialIpt){
                                //获得输入内容
                                var specialValue = $(specialIpt).val() || "";
                                specialArr.push(specialValue);
                            });

                            thisCheckVal+= "-" + specialArr.join("-");
                        }

                        //把每条选中数据发送给结果数组中
                        checkValArr.push(thisCheckVal);
                    }
                });
                //将整个数组拼接成字符串 每项选中数据之间用","分割
                reslut[itemValue] = checkValArr.join(",");

            }
            return reslut;

        },
        //获取下拉选择框的数据 跟普通输入框一样
        _getValeuToSelect:function(itemObj){
            //结果
            var reslut = {};
            //获得所有输入框
            var $selectList = itemObj.find(">.data-item-cont>.data-select");
            //循环获得所有的输入框的字段名和数据
            $selectList.each(function (i,select){
                var $select = $(select),
                    selectName = $select.attr("data-value") || "",//字段名
                    $selected = $select.find("option:selected");//获得所有选中项 支持多选
                    selectVal = $select.find("option:selected").val();//字段内容
                //存放结果的数组
                var selectVal = [];
                $selected.each(function (j,option){
                    //获得变量值
                    var optionValue = $(option).val();
                    //放入结果
                    if(optionValue)
                        selectVal.push(optionValue);
                });

                //设置每一条数据
                reslut[selectName] = selectVal.join(",");
            });
            return reslut;
        },
        //获得可选项目的选中状态 传入一个参数：即当前项目
        _getValueToOptionalItem:function(item){
            //结果
            var reslut = {};
            //获得选择框
            var $itemOpt = item.find(">.data-item-tit input.optional-checkbox");
            //字段名
            var itemOptName = $itemOpt.attr("data-value");
            //获得选择框状态 1未选中 0 为未选中
            var itemOptVal = $itemOpt.attr("data-check") || "0";
            //设置可选框数据
            reslut[itemOptName] = itemOptVal;
            return reslut;
        },
        //获取ComboSelect 下拉选择框值
        _getValeuToComboSelect:function(itemObj){
            //结果
            var reslut = {};
            //获得所有输入框
            var $selectList = itemObj.find(">.data-item-cont .data-combo-select");
            //循环获得所有的输入框的字段名和数据
            $selectList.each(function(i,select){
                var $select = $(select),
                    selectName = $select.attr("data-value") || "",//字段名
                    selectVal = $select.find("option:selected").val() || "";//字段内容
                //设置每一条数据
                reslut[selectName] = selectVal;
            });
            //console.log(reslut)
            return reslut;
        },
        //重置目标下的所有项目内容
        clearItem:function(obj){
            var self = this,
                _itemClass = self.itemClass,//项目主容器class
                $item = obj, //当前清除项目
                itemOptional = $item.attr("data-optional"),//当前是否为可选项
                $subItem = $item.find(_itemClass+"[data-type]:not('[data-optional]')"), //不是可选项的所有项目
                $subOptItem = $item.find(_itemClass+"[data-optional='true']");//所有可选项项目
            //重置当前项目内容
            if(itemOptional == "true"){
                this._clearItemData($item,true);
                this._initOptionalItem($item);
            }
            else{
                this._clearItemData($item,false);
            }
            //重置可选项
            this._clearItemData($subOptItem,true);
            this._initOptionalItem($subOptItem);
            //重置非可选项
            this._clearItemData($subItem,false);


        },
        //重置目标div下所有内容 两个参数 第一个重置内容 第二个为是否为可选项
        _clearItemData:function(targetObj,optional){
            var self = this,
                _itemClass = self.itemClass;//项目主容器class
            //获得操作目标
            var $itemCont = targetObj.find(">.data-item-cont"),//该项目内容
                $itemChildren = targetObj.find(_itemClass+"[data-type]"),//所有子项目
                optState = optional || false;//可选状态

            //如果为可选项 则设置隐藏
            if(optState && optState == true){
                $itemCont.add($itemChildren).hide();
            }
            //清除输入框内容
            $itemCont.add($itemChildren).find(".data-text").val("");
            //清除分割文本输入框内容
            $itemCont.add($itemChildren).find(".data-division-text").val("");
            //清空所有选择框和特殊选择框后面的输入框内容
            $itemCont.add($itemChildren).find(".data-check").prop("checked",false);
            $itemCont.add($itemChildren).find(".data-check-txt").val("");
            //清除下拉选择框
            // $itemCont.add($itemChildren).find(".data-select").val("");
            $itemCont.add($itemChildren).find(".data-select option:first").prop("selected",true);
            //清除插件下拉框
            var $comboSelect = $itemCont.add($itemChildren).find(".data-combo-select");
            if($comboSelect.length > 0){
                $comboSelect.find("option:first").prop("selected",true);
                $comboSelect.comboSelect();
            }
            
            //将目标对象下的所有多选框 清除选中
            targetObj.find("input:checkbox").prop("checked",false);
            //清除可选项目的选中状态
            targetObj.find("input.optional-checkbox").attr("data-check","0");
        },
        //判断传入的对象是否为jquery对象
        typeOfJquery:function(obj){
            var $obj = null;
            //判断对象是否存在
            if(obj){
                //判断是否为jquery
                if(obj instanceof jQuery){
                    $obj = obj;
                }else{
                    $obj = $(obj);
                }
            }
            //返回最终结果
            return $obj;
        }
    };

    //实例化当前对象 设置调用路径
    win.McakeForm = McakeForm;

})(window);